
#include "mlVec2.h"

namespace ml
{

	Vec2::Vec2()
	{
		zero();
	}

	Vec2::Vec2(const Vec2 &a)
	{
		X = a.X;
		Y = a.Y;
	}

	Vec2::Vec2(float x, float y)
	{
		X = x;
		Y = y;
	}

	Vec2::~Vec2()
	{
	}

	Vec2 &Vec2::operator =(const Vec2 &a)
	{
		X = a.X;
		Y = a.Y;
		return *this;
	}
	bool Vec2::operator ==(const Vec2 &a) const
	{
		return X == a.X && Y == a.Y;
	}
	bool Vec2::operator !=(const Vec2 &a) const
	{
		return X != a.X || Y != a.Y;
	}
	Vec2 Vec2::operator -() const
	{
		return Vec2(-X, -Y);
	}

	Vec2 Vec2::operator +(const Vec2 &a) const
	{
		return Vec2(X + a.X, Y + a.Y);
	}
	Vec2 Vec2::operator -(const Vec2 &a) const
	{
		return Vec2(X - a.X, Y - a.Y);
	}
	Vec2 Vec2::operator *(float a) const
	{
		return Vec2(a * X, a * Y);
	}
	Vec2 Vec2::operator /(float a) const
	{
		if (a == 0) return *this;
		float ar = 1.0f / a;
		return Vec2(ar * X, ar * Y);
	}
	Vec2 &Vec2::operator +=(const Vec2 &a)
	{
		X += a.X;
		Y += a.Y;
		return *this;
	}
	Vec2 &Vec2::operator -=(const Vec2 &a)
	{
		X -= a.X;
		Y -= a.Y;
		return *this;
	}
	Vec2 &Vec2::operator *=(float a)
	{
		X *= a;
		Y *= a;
		return *this;
	}
	Vec2 &Vec2::operator /=(float a)
	{
		if (a == 0) return *this;
		float ar = 1.0f / a;
		X *= ar;
		Y *= ar;
		return *this;
	}

	float Vec2::operator [](int i) const
	{
		switch (i)
		{
		case 0:
			return X;
		case 1:
			return Y;
		default:	//is this the right course of action to take
			return X;
		}
	}
	float &Vec2::operator [](int i)
	{
		switch (i)
		{
		case 0:
			return X;
		case 1:
			return Y;
		default:	//is this the right course of action to take
			return X;
		}
	}

	float Vec2::operator *(const Vec2 &a) const
	{
		return X * a.X + Y * a.Y;
	}

	float * Vec2::toFloatPtr(void)
	{
		return (float *)this;
	}

	void Vec2::normalize()
	{
		float magSq = X*X + Y*Y;
		if (magSq > 0.0f) { // check for divide-by-zero
			float ar = 1.0f / sqrt(magSq);
			X *= ar;
			Y *= ar;
		}
	}
	void Vec2::zero()
	{
		X = 0.0f;
		Y = 0.0f;
	}

}
